package com.hb.C_Lambda表达式和集合.E_内联函数


/**
 * 返回值为最后一行
 *
 * 1、with函数使用的一般结构
     with(object){
    //todo
    }
 *
 * 2、with函数底层的inline扩展函数+lambda结构
      @kotlin.internal.InlineOnly
    public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
 *
 * 3、with函数inline结构的分析
 * with函数和前面的几个函数使用方式略有不同，因为它不是以扩展的形式存在的。
 * 它是将某对象作为函数的参数，在函数块内可以通过 this 指代该对象。
 * 返回值为函数块的最后一行或指定return表达式。可以看出with函数是接收了两个参数，
 * 分别为T类型的对象receiver和一个lambda函数块，所以with函数最原始样子如下:
 *
 * 4、with函数的适用的场景
 * 适用于调用同一个类的多个方法时，可以省去类名重复，
 * 直接调用类的方法即可，经常用于Android中RecyclerView中onBinderViewHolder中，
 * 数据model的属性映射到UI上
 */
fun main() {
    val user=User("Java",18);
    val result = with(user, {
        println("my name is $name, I am $age years old")
        1000
    })
    println(result)
    //但是由于with函数最后一个参数是一个函数，可以把函数提到圆括号的外部，所以最终with函数的调用形式如下:
    val result2 = with(user) {
        println("my name is $name, I am $age years old")
        1000
    }
    //1000
    println(result2)
}